﻿#include <iostream>
using namespace std;

#include <thread>//线程

#include<mutex>//互斥锁

#include <string>

//死锁问题
//线程2等线程1，而线程1也要等线程2，相互等待


//int a = 0;
//mutex mtx1, mtx2;
//
//void func1()
//{
//	for (int i = 0; i < 10000; i++)
//	{
//		//写之前加锁
//		mtx1.lock();//加锁，别的线程不能访问
//		mtx2.lock();
//		
//		a += 1;
//		mtx1.unlock();//解锁
//		mtx2.unlock();
//	}
//}
//
//void func2()
//{
//	for (int i = 0; i < 10000; i++)
//	{
//		//写之前加锁
//		mtx2.lock();//加锁，别的线程不能访问
//		mtx1.lock();
//
//		a += 1;
//		mtx2.unlock();//解锁
//		mtx1.unlock();
//	}
//}
//
//int main(void)
//{
//	thread t1(func1);
//	thread t2(func2);
//	t1.join();
//	t2.join();
//	cout << a << endl;
//	return 0;
//}

//解决方法，拿m1就把m1,m2两个都拿了
/*都是对mtx1进行加锁，获取所有权，当1拿到之后2等待，同一时刻只有1个
*/
int a = 0;
mutex mtx1, mtx2;

void func1()
{
	for (int i = 0; i < 10000; i++)
	{
		//写之前加锁
		mtx1.lock();//加锁，别的线程不能访问
		mtx2.lock();

		a += 1;
		mtx1.unlock();//解锁
		mtx2.unlock();
	}
}

void func2()
{
	for (int i = 0; i < 10000; i++)
	{
		//写之前加锁
		mtx1.lock();//加锁，别的线程不能访问
		mtx2.lock();

		a += 1;
		mtx2.unlock();//解锁
		mtx1.unlock();
	}
}

int main(void)
{
	thread t1(func1);
	thread t2(func2);
	t1.join();
	t2.join();
	cout << a << endl;
	return 0;
}